home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / ARPCMD.C < prev    next >
C/C++ Source or Header  |  1988-07-26  |  4KB  |  197 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9.  
  10. extern char badhost[];
  11. extern char nospace[];
  12.  
  13. int doarpadd(),doarpdrop();
  14. struct cmds arpcmds[] = {
  15.     "add", doarpadd, 4,
  16.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  17.     "arp add failed",
  18.  
  19.     "drop", doarpdrop, 3,
  20.     "arp drop <hostid> ether|ax25|netrom",
  21.     "not in table",
  22.  
  23.     "publish", doarpadd, 4,
  24.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  25.     "arp add failed",
  26.  
  27.     NULLCHAR, NULLFP, 0,
  28.     "arp subcommands: add, drop, publish",
  29.     NULLCHAR, 
  30. };
  31. char *arptypes[] = {
  32.     "NET/ROM",
  33.     "10 Mb Ethernet",
  34.     "3 Mb Ethernet",
  35.     "AX.25",
  36.     "Pronet",
  37.     "Chaos",
  38.     "Arcnet",
  39.     "Appletalk"
  40. };
  41.  
  42. int
  43. doarp(argc,argv)
  44. int argc;
  45. char *argv[];
  46. {
  47.     if(argc < 2){
  48.         dumparp();
  49.         return 0;
  50.     }
  51.     return subcmd(arpcmds,argc,argv);
  52. }
  53. static
  54. doarpadd(argc,argv)
  55. int argc;
  56. char *argv[];
  57. {
  58.     int16 hwalen,hardware,naddr;
  59.     int32 addr,resolve();
  60.     char *hwaddr;
  61.     struct arp_tab *ap;
  62.     struct arp_type *at;
  63.     void arp_drop();
  64.     int pub = 0;
  65.  
  66.     if(argv[0][0] == 'p')    /* Is this entry published? */
  67.         pub = 1;
  68.     if((addr = resolve(argv[1])) == 0){
  69.         printf(badhost,argv[1]);
  70.         return 1;
  71.     }
  72.     /* This is a kludge. It really ought to be table driven */
  73.     switch(tolower(argv[2][0])){
  74.     case 'n':    /* Net/Rom pseudo-type */
  75.         hardware = ARP_NETROM;
  76.         naddr = 1;
  77.         break;
  78.     case 'e':    /* "ether" */
  79.         hardware = ARP_ETHER;
  80.         naddr = 1;
  81.         break;        
  82.     case 'a':    /* "ax25" */
  83.         hardware = ARP_AX25;
  84.         naddr = argc - 3;
  85.         break;
  86.     case 'm':    /* "mac appletalk" */
  87.         hardware = ARP_APPLETALK;
  88.         naddr = 1;
  89.         break;
  90.     default:
  91.         printf("unknown hardware type \"%s\"\n",argv[2]);
  92.         return -1;
  93.     }
  94.     /* If an entry already exists, clear it */
  95.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  96.         arp_drop(ap);
  97.  
  98.     at = &arp_type[hardware];
  99.     if(at->scan == NULLFP){
  100.         printf("Attach device first\n");
  101.         return 1;
  102.     }
  103.     /* Allocate buffer for hardware address and fill with remaining args */
  104.     hwalen = at->hwalen * naddr;
  105.     if((hwaddr = malloc(hwalen)) == NULLCHAR){
  106.         printf(nospace);
  107.         return 0;
  108.     }
  109.     /* Destination address */
  110.     (*at->scan)(hwaddr,&argv[3],argc - 3);
  111.     ap = arp_add(addr,hardware,hwaddr,hwalen,pub);    /* Put in table */
  112.     free(hwaddr);                    /* Clean up */
  113.     stop_timer(&ap->timer);            /* Make entry permanent */
  114.     ap->timer.count = ap->timer.start = 0;
  115.     return 0;
  116. }
  117. /* Remove an ARP entry */
  118. static
  119. doarpdrop(argc,argv)
  120. int argc;
  121. char *argv[];
  122. {
  123.     int16 hardware;
  124.     int32 addr,resolve();
  125.     struct arp_tab *ap;
  126.     void arp_drop();
  127.  
  128.     if((addr = resolve(argv[1])) == 0){
  129.         printf(badhost,argv[1]);
  130.         return 1;
  131.     }
  132.     /* This is a kludge. It really ought to be table driven */
  133.     switch(tolower(argv[2][0])){
  134.     case 'n':
  135.         hardware = ARP_NETROM;
  136.         break;
  137.     case 'e':    /* "ether" */
  138.         hardware = ARP_ETHER;
  139.         break;        
  140.     case 'a':    /* "ax25" */
  141.         hardware = ARP_AX25;
  142.         break;
  143.     case 'm':    /* "mac appletalk" */
  144.         hardware = ARP_APPLETALK;
  145.         break;
  146.     default:
  147.         hardware = 0;
  148.         break;
  149.     }
  150.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  151.         return -1;
  152.     arp_drop(ap);
  153.     return 0;    
  154. }
  155. /* Dump ARP table */
  156. static
  157. dumparp()
  158. {
  159.     register int i;
  160.     extern struct arp_stat arp_stat;
  161.     register struct arp_tab *ap;
  162.     char e[128];
  163.     char *inet_ntoa();
  164.     extern char *arptypes[];
  165.  
  166.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  167.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  168.      arp_stat.replies,arp_stat.outreq);
  169.  
  170.     printf("IP addr         Type           Time Q Addr\n");
  171.     for(i=0;i<ARPSIZE;i++){
  172.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  173.             printf("%-16s",inet_ntoa(ap->ip_addr));
  174.             printf("%-15s",arptypes[ap->hardware]);
  175.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  176.             if(ap->state == ARP_PENDING)
  177.                 printf("%-2u",len_q(ap->pending));
  178.             else
  179.                 printf("  ");
  180.             if(ap->state == ARP_VALID){
  181.                 if(arp_type[ap->hardware].format != NULLFP){
  182.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  183.                 } else {
  184.                     e[0] = '\0';
  185.                 }
  186.                 printf("%s",e);
  187.             } else {
  188.                 printf("[unknown]");
  189.             }
  190.             if(ap->pub)
  191.                 printf(" (published)");
  192.             printf("\n");
  193.         }
  194.     }
  195.     return 0;
  196. }
  197.